home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland Pascal with Objects 7.0 / HEAPSPY.ZIP / HWTPWH.PAS < prev   
Pascal/Delphi Source File  |  1992-10-27  |  5KB  |  226 lines

  1. {$A-,B-,E-,F-,G+,I-,K-,N-,O-,P-,Q-,R-,S-,T+,V-,W-,X+}
  2.  
  3. {**********************************************}
  4. {                                              }
  5. {   HeapSpy - HWTPWh Module                    }
  6. {   Copyright (c) 1992  Borland International  }
  7. {                                              }
  8. {**********************************************}
  9.  
  10. unit HWTPWh;
  11.  
  12. {$C MOVEABLE DEMANDLOAD DISCARDABLE}
  13.  
  14. interface
  15.  
  16. uses Wintypes, WinProcs, Objects, ODialogs, OWindows, BWCC,
  17.   Strings, Toolhelp, HWGlobal, HWHexDmp, HWBitmap;
  18.  
  19. type
  20.   PTPWHeap = ^TTPWHeap;
  21.   TTPWHeap = object(TSortListWin)
  22.     HHeap: THandle;
  23.     constructor Init(AParent: PWindowsObject; AHHeap: Word; AModule: PChar);
  24.     procedure BuildList; virtual;
  25.     function HandleSelect(LeftClick: Boolean): Boolean; virtual;
  26.     function GetItemString(p: Pointer): PChar; virtual;
  27.     procedure DeleteItem(p: Pointer); virtual;
  28.     function Less(p1, p2: Pointer): Integer; virtual;
  29.   end;
  30.  
  31. implementation
  32. type
  33.   PTPWEntry = ^TTPWEntry;
  34.   TTPWEntry = record
  35.     dwSize: LongInt;
  36.     HHeap  : Word;
  37.     wOffset: Word;
  38.     wSize  : Word;
  39.     wType  : Word;
  40.     wNext  : Word;
  41.   end;
  42.  
  43. const
  44.   TT_Control = 0;
  45.   TT_InUse   = 1;
  46.   TT_Free    = 2;
  47.  
  48. function DoTypeLit(Dest: PChar; wType: Word): PChar;
  49. const
  50.   TypeLit: array[0..2] of PChar = ('Control','In Use','Free');
  51. begin
  52.   StrCopy(Dest,TypeLit[wType]);
  53.   DoTypeLit := Dest;
  54. end;
  55.  
  56. function TPWFirst(var T: TTPWEntry;AHeap: THandle): Bool;
  57. var
  58.   Tmp: PTPWSubBlock;
  59. begin
  60.   TPWFirst := False;
  61.   Tmp := PtrFromHandle(AHeap);
  62.   if Tmp = nil then exit;
  63.   with T do
  64.   begin
  65.     HHeap  := aHeap;
  66.     wType := TT_Control;
  67.     wOffset := 0;
  68.     wNext   := SizeOf(Tmp^);
  69.     wSize   := wNext;
  70.   end;
  71.   TPWFirst := True;
  72. end;
  73.  
  74. function TPWNext(var T: TTPWEntry): Bool;
  75. var
  76.   Tmp: PTPWFreeEntry;
  77.   ff: Word;
  78.   BlockSize: LongInt;
  79.  
  80. function FindFirstFree(Fence: Word): Word;
  81. var
  82.   Ctl: PTPWSubBlock;
  83.   FreeOfs: Word;
  84.   BestBet: Word;
  85. begin
  86.   BestBet := BlockSize;
  87.   Ctl := PTPWSubBlock(Tmp);
  88.   FreeOfs := Ctl^.FreeList;
  89.   while FreeOfs <> 0 do
  90.   begin
  91.     if FreeOfs >= Fence then
  92.       if FreeOfs <= BestBet then BestBet := FreeOfs;
  93.     Word(Tmp) := FreeOfs;
  94.     FreeOfs := Tmp^.Next;
  95.   end;
  96.   Word(Tmp) := BestBet;
  97.   FindFirstFree := BestBet;
  98. end;
  99.  
  100. begin
  101.   TPWNext := False;
  102.   BlockSize := GlobalSize(T.HHeap);
  103.   if T.wNext >= BlockSize then exit;
  104.   Tmp := PtrFromHandle(T.HHeap);
  105.   if Tmp = nil then exit;
  106.   ff := FindFirstFree(T.wNext);
  107.   if ff <> T.wNext then
  108.      with T do
  109.      begin
  110.        wType := TT_InUse;
  111.        wOffset := wNext;
  112.        wSize := ff-wNext;
  113.        wNext := ff;
  114.      end
  115.   else
  116.     with T do
  117.     begin
  118.       wType := TT_Free;
  119.       wOffset := ff;
  120.       wSize := Tmp^.Size;
  121.       wNext := ff+wSize;
  122.     end;
  123.  TPWNext := True;
  124. end;
  125.  
  126. constructor TTPWHeap.Init;
  127. var
  128.   ATitle: array[0..30] of char;
  129. begin
  130.  HHeap := AHHeap;
  131.  WVSPrintF(ATitle,'%s TPW Heap', AModule);
  132.  Inherited Init(AParent,  ATitle, True);
  133. end;
  134.  
  135. procedure TTPWHeap.BuildList;
  136. var
  137.   TPW: TTPWEntry;
  138.   LP: PTPWEntry;
  139. begin
  140.   TPW.dwSize := sizeof(TTPWEntry);
  141.   TPWFirst(TPW,HHeap);
  142.   repeat
  143.     with TPW do
  144.     begin
  145.       New(LP);
  146.       Move(TPW,LP^,Sizeof(TTPWEntry));
  147.       List^.AddString(PChar(LP));
  148.     end;
  149.    until not TPWNext(TPW);
  150. end;
  151.  
  152. function TTPWHeap.GetItemString(p: Pointer): PChar;
  153. var
  154.   GL: PTPWEntry absolute p;
  155.   ListString: array[0..127] of Char;
  156.   Temp: array[0..80] of Char;
  157.   NumStr: array[0..20] of Char;
  158. begin
  159.   with GL^ do
  160.   begin
  161.     HexW(ListString,wOffset);
  162.     DoTypeLit(Temp,wType);
  163.     Str(wSize:7,NumStr);
  164.     StrCat(ListString,'  ');
  165.     StrCat(ListString,NumStr);
  166.     StrCat(ListString,'  ');
  167.     StrCat(ListString,Temp);
  168.     GetItemString := StrNew(ListString);
  169.   end;
  170. end;
  171.  
  172. procedure TTPWHeap.DeleteItem;
  173. begin
  174.   Freemem(p,Sizeof(TTPWEntry));
  175. end;
  176.  
  177. function TTPWHeap.Less(p1,p2: Pointer): Integer;
  178. var
  179.  LE1: PTPWEntry absolute p1;
  180.  LE2: PTPWEntry absolute p2;
  181.  Key1,Key2: LongInt;
  182. begin
  183.   case SortOpt of
  184.     cm_sbAddress:
  185.       begin
  186.         Key1 := LE1^.wOffset;
  187.         Key2 := LE2^.wOffset;
  188.       end;
  189.     cm_sbHandle:
  190.       begin
  191.         Key1 := LE1^.wOffset;
  192.         Key2 := LE2^.wOffset;
  193.       end;
  194.     cm_sbSize:
  195.       begin
  196.         Key1 := (LongInt(LE1^.wSize) shl 16) or LE1^.wOffset;
  197.         Key2 := (LongInt(LE2^.wSize) shl 16) or LE2^.wOffset;
  198.       end;
  199.     cm_sbType:
  200.       begin
  201.         Key1 := (LongInt(LE1^.wType) shl 16) or LE1^.wOffset;
  202.         Key2 := (LongInt(LE2^.wType) shl 16) or LE2^.wOffset;
  203.       end;
  204.     cm_sbModule:
  205.       begin
  206.         Key1 := LE1^.wOffset;
  207.         Key2 := LE2^.wOffset;
  208.       end;
  209.   end;
  210.   Less := Compare32(Key1, Key2);
  211. end;
  212.  
  213.  
  214. function TTPWHeap.HandleSelect(LeftClick: Boolean): Boolean;
  215. var
  216.   GP: PTPWEntry;
  217. begin
  218.   HandleSelect := True;
  219.   GP := PTPWEntry(SendMEssage(List^.hWindow,LB_GETITEMDATA,List^.GetSelIndex,
  220.     0));
  221.   with Application^,GP^ do
  222.     MakeWindow(New(PHexDmpWin,Init(MainWindow,HHeap,wOffset,wSize)));
  223. end;
  224.  
  225. end.
  226.